package ioc;

import service.UserService;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;

public class AnnotationApplicationContext
{
    String scanpath ;
    public AnnotationApplicationContext(String name){
        this.scanpath = name;

    }

    /*
     *  1. 初始化 IoC 容器。
        2. 读取配置文件。
        3. 将配置文件转换为容器识别对的数据结构（这个数据结构在Spring中叫做 BeanDefinition
        4. 利用数据结构依次实例化相应的对象
        5. 注入对象之间的依赖关系
        * */
    public void  init() throws IOException {

        //获得类 注入到容器
        String packageName = scanpath.replace(".","/");

        Enumeration<URL> dirs = Thread.currentThread().getContextClassLoader().getResources(packageName);

        List<String> classNames = new ArrayList<String>();

        boolean recursive = true;
        while (dirs.hasMoreElements()){
            URL url = dirs.nextElement();
            // 得到协议的名称
            String protocol = url.getProtocol();
            // 如果是以文件的形式保存在服务器上
            if ("file".equals(protocol)) {
                // 获取包的物理路径
                String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
                // 以文件的方式扫描整个包下的文件 并添加到集合中
                scanClassesInPackageByFile(scanpath, filePath, recursive, classNames);
            }
        }

        if(classNames.size()>0){
            classNames.stream().forEach(i->{
                try {
                    Class<?> aclass = Thread.currentThread().getContextClassLoader().loadClass(i);
                    UserService userService = (UserService) aclass.newInstance();
                    userService.add("yfm");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

        }
    }




    public static void scanClassesInPackageByFile(String scanPath, String packagePath, final boolean recursive,
                                                  List<String> classNames) {


        File dir = new File(packagePath);
        if(!dir.exists()||!dir.isDirectory()){
            return;
        }

        File[] dirfiles = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return ( (recursive&&pathname.isDirectory()) || pathname.getName().endsWith(".class")  );
            }
        });

        //循环所有文件
        for(File file : dirfiles){
            if(file.isDirectory()){
                scanClassesInPackageByFile(scanPath+"."+file.getName(),file.getAbsolutePath(),recursive,classNames);
            }else{
                classNames.add(scanPath+"."+file.getName().substring(0,file.getName().length()-6));
            }
        }


    }


    public static void main(String[] args) throws IOException {
        AnnotationApplicationContext a = new AnnotationApplicationContext("service.impl");
        a.init();

    }

}
